﻿using System.Diagnostics;
using CodeAgent.Host.Functions;
using CodeAgent.Host.Workspace;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Connectors.OpenAI;

#pragma warning disable SKEXP0010

#pragma warning disable SKEXP0110

namespace CodeAgent.Host.Agents;

public class CodeAgent
{
    public static ChatCompletionAgent CreateCodeAgent(AgentOption option, string userId)
    {
        var kernelBuilder = Kernel.CreateBuilder();

        kernelBuilder.AddOpenAIChatCompletion("gpt-4o", option.Endpoint, option.ApiKey);

        kernelBuilder.Plugins.AddFromType<FileFunction>();
        kernelBuilder.Plugins.AddFromType<DockerSkill>();

        var kernel = kernelBuilder.Build();

        const string reviewAgentName = "CodeAgent";
        string reviewInstruction =
            $"""
              # CodeAgent: 专业程序员助手
              
              ## 角色定义
              你是CodeAgent，一位精通多种编程语言的专业程序员。你具备扎实的编程技术，熟练掌握各类开发工具和最佳实践。
              
              ## 职责范围
              - 根据用户需求提供清晰、可执行的代码解决方案
              - 解决编译错误、运行异常和逻辑问题
              - 优化代码性能和质量
              - 管理依赖和环境配置
              
              ## 工作流程
              1. **需求分析**：仔细理解用户的编程需求和目标
              2. **解决方案设计**：设计最佳技术方案和架构
              3. **代码实现**：编写完整、功能正确的代码
              4. **文件存储**：将所有代码文件保存到指定位置
              5. **结果通知**：告知用户代码存储位置
              6. **任务完成**：通知管理员工作已完成
              
              ## 代码实现规范
              - **完整性**：所有代码必须是完整的、可直接运行的
              - **文件指导**：明确标注每段代码应存放的具体文件
              - **依赖说明**：提供所有必要的库依赖和版本要求
              - **环境配置**：附带完整的环境配置说明
              - **运行指南**：包含清晰的代码运行步骤
              - 将代码部署到 Docker 容器中进行测试
              
              ## 文件存储要求
              - **根目录**：所有代码必须存储到 `{WorkspaceContext.GetWorkspacePath(userId)}` 目录
              - **项目结构**：在根目录下创建专门的项目文件夹，采用合理的目录结构
              - **自动保存**：每次任务完成后，确保所有代码文件已保存到正确路径
              - **位置通知**：仅向用户提供代码存储位置，不在对话中展示完整代码内容
              
              ## 结束条件
              当你完成全部代码实现并将所有文件正确保存到指定位置后，请通知管理员工作已完成。
              
              """;
        var codeReviewAgent = new ChatCompletionAgent()
        {
            Name = reviewAgentName,
            Instructions = reviewInstruction,
            Kernel = kernel,
            Description = "你是一位专业的程序员，擅长多种编程语言，熟练掌握各种编程技巧和工具。您能够帮助用户解决代码编写、调试、优化等方面的问题。",
            Arguments = new KernelArguments(new OpenAIPromptExecutionSettings()
            {
                FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),
                MaxTokens = 640000
            }),
        };

        return codeReviewAgent;
    }
}